// 设计一个算法，来实现二叉树的序列化与反序列化
// 1。 序列化：将二叉树转为字符串数据表示
// 按照前序递归遍历二叉树， 并将根节点和左右子树的值链接起来（中间用，隔开）
// 2. 反序列化：将字符串数据转为二叉树结构
// 从数组左侧取一个元素
//  如果当前元素为 空，返回null，
// 如果当前元素不为空，则新建一个二叉树节点作为根节点，保存值为当前元素值，并递归遍历左右子树，不断重复从数组中取出元素，进行判断
// 最后返回当前根节点

// 思路，递归，前序遍历
function serialize(root) {
    if (!root) {
        return ''
    }
    return root.val + ',' + serialize(root.left) + ',' + serialize(root.right)
}

const root = {
    val: "A",
    left: {
        val: "B",
        left: {
            val: "D",
        },
        right: {
            val: "E",
        },
    },
    right: {
        val: "C",
        right: {
            val: "F",
        },
    },
};

console.log(serialize(root))

function TreeNode(val) {
    this.val = val
    this.left = null
    this.right = null
}
function deserialize(data) {
    function dfs(arr) {
        let val = arr.shift()
        if (!val) {
            return null
        }
        let root = new TreeNode(val)
        root.left = dfs(arr)
        root.right = dfs(arr)
        return root
    }
    return dfs(data.split(','))
}
console.log(deserialize(serialize(root)))